/**
 * created by William
 * 需要全局有一个 app 属性, 并且时 vue 的实例, 后面引入模块管理工具后可移除
 */
(function (root) {

    const basePath = ''
    const Vue = root.Vue
    const axios = root.axios
    const notify = root.Vue.prototype.$notify
    const ccService = {}

    /**
     * 获取数据库表信息-代码生成
     * @returns {*}
     */
    ccService.listTable = function (params) {
        const options = {
            url: basePath + '/codeGen/listTable',
            params: params
        }
        return axios(options)
    }

    /**
     * 请求结果处理
     * @param service
     * @returns {{}}
     */
    function wrapService(service) {
        const $service = {}
        const ERROR_MSGS = {
            '401': '未授权情况',
            '403': '您还没登录',
            '404': '资源不存在',
            '500': '服务器内部错误'
        }
        Object.keys(service).forEach(function (key) {
            $service[key] = function (args, message) {
                return service[key](args)
                    .then(function (result) {
                        const code = result.data.code
                        const data = result.data.data
                        const msg = result.data.msg
                        if (code == 0) {
                            if (message) {
                                notify({
                                    title: '操作成功',
                                    type: 'success',
                                    message
                                })
                            }
                            return data
                        } else {
                            throw new Error(msg || ERROR_MSGS[code])
                        }
                    })
                    .catch(function (error) {
                        notify({
                            title: '操作失败',
                            type: 'error',
                            message: error.message
                        })
                        return Promise.reject(error)
                    })
            }
        })
        return $service
    }

    root.Vue.prototype.$service = wrapService(ccService)

})(window)